﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;

using calculator;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        private int numElements = 3000; // значение поля "Размер контейера"

        private List<int> input;   // входной список int-ов из поля "Элементы контейнера"
       
        private List<int> output;  // выходной список (на нём формеруется график)

        private string[] str;     // временный массив 

        Calculator calc;

        //-------------------------------------------------------------------------------------------
        // Пользователь нажал кнопку "Расчитать"

        private void button1_Click(object sender, EventArgs e)
        {
            // Отчитстить данные
            input.RemoveRange(0, input.Count);
            output.RemoveRange(0, output.Count);

            str = richTextBox1.Text.Split(new char[] { ' ', '\n', ',' }); // Получаем массив int-ов из поля "Элементы контейнера"

            if (str.Length <= 0)
            {
                MessageBox.Show("Введите данные.", "Ошибка");
                return;
            }

            // Получаем значение из поля "Размер контейнера"
            try
            {
                numElements = int.Parse(textBox1.Text);
            }
            catch (FormatException ex)
            {
                numElements = 0;
            }

            if (numElements <= 0)
            {
                MessageBox.Show("Некорректное значение в поле \"Размер контейнера\"", "Ошибка");
                return;
            }

            // Основные действия

            for (int i = 0; i < str.Length; i++)
            {
                try
                {
                    if (str[i].Length != 0)
                        input.Add(int.Parse(str[i]));
                }
                catch (FormatException ex)
                {
                    continue;
                }
            }

            if (input.Count <= 0)
            {
                MessageBox.Show("Введите данные.", "Ошибка");
                return;
            }

            calc = new Calculator(input, numElements);

            info1.Text = "Количество контейнеров: " + calc.Count;
            info2.Text = "Незаполненные контейнеры: " + calc.getFreeSpaces().Count;
            info4.Text = "В среднем не заполнены: " + calc.getAverageSize();
            info5.Text = "Минимально заполнены: " + calc.getMinSize();
            info6.Text = "Максимально заполнены: " + calc.getMaxSize();

            textBox2.Text = calc.toString();

            output = calc.getFreeSpaces();

            // Обновить диаграмму
            UpdateDiagram();
        }

        //-------------------------------------------------------------------------------------------
        // Инициализация

        private void CalcLoad()
        {
            diagram.ChartAreas.Add("area1");

            diagram.ChartAreas["area1"].AxisX.Minimum = 0;
            diagram.ChartAreas["area1"].AxisX.Maximum = 10;
            diagram.ChartAreas["area1"].AxisX.Interval = 1;

            diagram.ChartAreas["area1"].AxisY.Minimum = 0;
            diagram.ChartAreas["area1"].AxisY.Maximum = 10;
            diagram.ChartAreas["area1"].AxisY.Interval = 1;

            diagram.Series.Add("data");

            diagram.Series["data"].ChartType = System.Windows.Forms.DataVisualization.Charting.SeriesChartType.Line;

            input = new List<int>();
            output = new List<int>();
        }

        //-------------------------------------------------------------------------------------------
        // Отчищяет график

        private void ClearDiagram()
        {

            for (int i = 0; i < diagram.Series["data"].Points.Count; i++)
                diagram.Series["data"].Points.RemoveAt(i);

            diagram.ChartAreas["area1"].AxisY.Maximum = 10;
            diagram.ChartAreas["area1"].AxisX.Maximum = 10;

            diagram.Update();
        }

        //-------------------------------------------------------------------------------------------
        // Обновляет график

        private void UpdateDiagram()
        {
            ClearDiagram();

            if (output.Count < 3)
            {
                diagram.Visible = false;
                label3.Visible = true;
                return;
            }
            else
            {
                diagram.Visible = true;
                label3.Visible = false;
            }

            diagram.ChartAreas["area1"].AxisY.Maximum = output[output.Count - 1] - output[0];
            diagram.ChartAreas["area1"].AxisX.Maximum = output.Count - 0;

            diagram.ChartAreas["area1"].AxisX.Interval = output.Count / 10;
            diagram.ChartAreas["area1"].AxisY.Interval = (output[output.Count - 1] - output[0])/10;

            for (int i = 1; i < output.Count; i++)
            {
                diagram.Series["data"].Points.AddXY(i, output[i] - output[0]); // значения по Х и Y
            }

            diagram.Update();
        }

        public Form1() { InitializeComponent(); CalcLoad(); str = new string[1];}
    }
}
